import axios, { AxiosInstance } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import { Session } from '/@/utils/storage';
import qs from 'qs';

// 配置新建一个 axios 实例
const service: AxiosInstance = axios.create({
	timeout: 50000,
	// 默认 JSON 格式，文件上传时会自动改为 multipart/form-data
	headers: { 'Content-Type': 'application/json' },
	paramsSerializer: {
		serialize(params) {
			return qs.stringify(params, { allowDots: true });
		},
	},
});

// 添加请求拦截器
service.interceptors.request.use(
	(config) => {
		// 携带 Token
		if (Session.get('token')) {
			config.headers!['Authorization'] = `${Session.get('token')}`;
		}
		// 关键修改：不对文件上传接口进行 qs 序列化
		// 判断是否为文件上传（Content-Type 为 multipart/form-data 或包含文件上传接口标识）
		const isFormData = config.data instanceof FormData;
		const isUploadApi = config.url?.includes('/api/common/upload') ||
			config.url?.includes('app/File/file'); // 包含你的上传接口路径

		// 仅对非文件上传的 POST 请求进行 qs 序列化
		if (config.method?.toLowerCase() === 'post' && !isFormData && !isUploadApi) {
			config.data = qs.stringify(config.data);
			// 非文件上传时强制设置表单格式（避免 JSON 格式冲突）
			config.headers!['Content-Type'] = 'application/x-www-form-urlencoded';
		}

		return config;
	},
	(error) => {
		return Promise.reject(error);
	}
);

// 添加响应拦截器
service.interceptors.response.use(
	(response) => {
		const res = response.data;
		// 成功状态（根据你的后端实际 code 调整，通常为 200 或 1）
		if (res.code === 1 || res.code === 200) {
			return res;
		}
		// 登录过期（code=3）
		else if (res.code === 3) {
			Session.clear(); // 清除缓存
			window.location.href = '/login'; // 跳登录页
			ElMessageBox.alert('登录已过期，请重新登录', '提示', {});
			return Promise.reject(new Error('登录过期'));
		}
		// 其他 code 均为失败
		else {
			ElMessage.error(res.msg || '请求失败');
			return Promise.reject(new Error(res.msg || '请求失败'));
		}
	},
	(error) => {
		// 网络层面错误处理
		if (error.message.includes('timeout')) {
			ElMessage.error('网络超时');
		} else if (error.message === 'Network Error') {
			ElMessage.error('网络连接错误');
		} else if (error.response) {
			ElMessage.error(`请求错误：${error.response.statusText}`);
		} else {
			ElMessage.error('接口请求失败');
		}
		return Promise.reject(error);
	}
);

export default service;